1 Introduction

L’oursin violet : Paracentrotus lividus (Lamarck, 1816), est un oursin de la famille des Parechinidae principalement représenté en mer Méditerrannée, en Océan Atlantique, en Manche et en mer du Nord. Il s’agit d’une espèce gonochorique dont les gonades sont consommées par l’homme. Organisme benthique et brouteur, il se nourrit principalement d’algues. Sa taille moyenne (test et piquants) est d’environ 8 cm.

Photographie de Paracentrotus lividus

Photographie de Paracentrotus lividus

2 But

L’objet de cette analyse est de savoir si l’echiniculture des Paracentrotus lividus a une influence sur la masse de leurs gonades.

3 Matériel et méthode

3.1 Acquisition des données

Les observations biométriques utilisées dans ce travail proviennent d’une étude expérimentale sur la croissance des Paracentrotus lividus de 1996 publiée dans " Journal of Experimental Marine Biology and Ecology " et réalisée par Ph. Grosjean, Ch. Spirlet et M. Jangoux.

Les oursins sauvages mesurés ainsi que la souche originelle des oursins d’élevage proviennent de la cote rocheuse de Morgat en Bretagne ( France ).

library(tidyverse)
library(cowplot)
#?map_data()
world <- map_data("world")
world$region <- as.factor(world$region)
world$subregion <- as.factor(world$subregion)
France <- filter(world, region == "France")

ggplot(data = France) +
  geom_polygon(mapping = aes(long, lat, group = group), fill= "white", color = "black")  +
  geom_point(aes(y = 48.230110 , x = -4.511736 , color = "#CD0000"), size = 2, show.legend = FALSE)+theme(plot.caption = element_text(hjust = 0.5), axis.line = element_blank(), axis.title = element_blank(),axis.text = element_blank(), axis.ticks = element_blank()) +
  coord_quickmap() +
  labs( caption = "Carte de la france avec la mise en évidence de Morgat ( Bretagne ) ")

3.2 Analyse des données

Nous fixons le seuil alpha à 0.05 pour l’ensemble des analyses ci dessous

  1. Pour comparer la masse des gonades des oursins d’élevage et des oursins sauvages nous utilisons le test d’hypothèse : test-t de Student comparant deux groupes d’échantillons indépendants.

Les hypothèses sont : \(H_{0}\) : \(\mu_{1} = \mu_{2}\) \(H_{1}\) : \(\mu_{1} \ne$ \mu_{2}\)

Les conditions de validités du test sont :

  • Un échantillonnage aléatoire
  • Des observations indépendantes les unes des autres

-> Ces deux conditions sont supposées validées

  • Une distribution des résidus qui doit suivre une distribution normale ou approximativement normale : un graphique quantile-quantile de comparaison de la distribution des résidus avec une distribution normale permet d’observer si cette condition est respectée.

Et/ou un grand nombre d’observations

Cette dernière condition sera testée lors de l’analyse statistique

  1. Un modèle de régression linéaire sera utilisé pour établir une relation linéaire entre 2 variables quantitatives. Le test ne traite pas ces 2 variables de manière égale : une des deux variables est dite dépendante de l’autre ( indépendante ).

on utilise comme critère de détermination de la droite : la minimisation de la somme des carrés des résidus.

  • Nous testons l’homoscedasticité avec 3 graphiques : - Le Graphique des résidus en fonction des valeurs ajustées.

                                                  - Le Graphique de la racine carrée des résidus en fonction des valeurs ajustées.
  • Nous testons graphiquement la pertinence de la distribution des résidus standardisés avec la distribution normale. # Résultats

library(readxl)
oursins <- read_excel("../data/oursins.xlsx", 
    skip = 9)
View(oursins)

3.3 Masse des gonades

3.3.1 Statistiques descriptives

3.3.1.1 Statistiques descriptives numériques

La moyenne de la masses des gonades est différente pour les oursins sauvages (\(1.00\pm1.53 g\)) et pour les oursins d’élevage (\(1.83\pm3.04 g\)). Les valeurs des écarts-types sont plus élevées que les valeurs des moyennes. Les mesures de la masse des gonades sont par conséquent, très dispersées autours de la moyenne.

library(dplyr)
oursins%>%group_by(origine)%>% summarise("mean" = mean(gonades, na.rm=TRUE), "sd" = sd(gonades, na.rm=TRUE), "number" = length(gonades)) -> gon_or

library(knitr)

kable(x = gon_or, format = "pandoc", caption = "Tableau de la masse des gonades moyenne (g) des oursins sauvages et d'élevage ", col.names = c("Origine", "Masse des gonades moyenne", "Ecart-type", "Nombre d'observations"), align = "c")

3.3.1.2 Statistiques descriptives graphiques

La représentation graphique sous forme de boxplot permet de se représenter visuellement sur les 5 nombres : la valeur minimale, le premier quartile, la mediane, le troisième quartile et la valeur maximale. Le graphique semble nous faire part d’une différence entre la masses des gonades des P.lividus sauvages et d’élevage.

library("ggplot2")
ggplot(data=oursins) +
  geom_boxplot(mapping=aes(x= as.factor(origine),y=gonades), fill=c("#26c40d", "#0d6bc4"))+
theme_classic() +
 labs( x = "Origine", y = "Masse des gonades (g)", caption = expression(paste("Boxplot de comparaison de la masse des gonades des ", italic(" P. lividus "), "selon leur origine.")))+
  theme(plot.caption = element_text(hjust = 0.5, size = 10))

Il semble également y avoir une variation de la masses des gonades des P.lividus en fonction du stade de maturité

library(ggplot2)
ggplot(data=oursins) +
  geom_boxplot(mapping=aes(x= as.factor(maturite),y=gonades, fill=origine))+
  theme_classic() +
 labs( x = "Origine", y = "Masse des gonades (g)", caption = expression(paste("Boxplot de comparaison de la masse des gonades des ", italic(" P. lividus "), "selon leur origine et en fonction de leur stade de maturité")))+
  theme(plot.caption = element_text(hjust = 0.5, size = 9))

3.3.2 Statistiques

3.3.2.1 Test d’hypothèse

library(dplyr)
oursins %>% mutate(gonades.res = gonades - ave(gonades, origine)) -> oursins
car::qqPlot(oursins$gonades.res, distribution = "norm",
  envelope = 0.95, col = "Black", ylab = "Résidus de la masses des gonades",xlab = "Quantiles de la distribution normale")
  • La distribution des résidus de la masses des gonades ne suit pas une distribution normale ( avec une intervale de confiance de 95%). Le premier critère d’application du test-t de student comparant deux groupes d’échantillons indépendants n’est pas respecté.

  • Le nombre d’obeservations est élevé.

-> Le tes-t de student indépendant peut être appliqué.

Les hypothèses sont :

\(H_{0}\) : \(\mu_{sauvage} = \mu_{élevage}\) \(H_{1}\) : \(\mu_{sauvage} \ne \mu_{élevage}\)

t.test(gonades ~ origine, data = oursins,
  alternative = "two.sided", conf.level = 0.95, var.equal = TRUE)

Le degré de confiance est fixé au seuil \(\alpha\) de 0.05 Le seuil de probabilité critique ( p ) est égale à 0.0004767 p < 0.05

->On a une différence significative entre les moyennes au seuil \(\alpha\) de 0.05 -> L’hypothèse \(H_{0}\) : \(\mu_{sauvage} = \mu_{élevage}\) est rejetée

3.3.2.2 Régression linéaire

library("corrplot")
corrplot::corrplot(cor(oursins[, 2:5],
  use = "pairwise.complete.obs"),method = "num")

La matrice de correlation nous donne un coefficiant de corrélation de 0.86 entre la masse des gonades et la masse.

library(dplyr)
oursins %>% mutate ( log_gonades= log(gonades+1)) -> oursins
#log (gonades+1) car log de 0 = infini -> probleme
library(tidyverse)
ggplot(data= oursins)+
geom_point (mapping = aes (x=masse, y=log_gonades))+
   labs( x = "Masse (g)", y = "Logarithme de la masse des gonades ", caption = expression(paste("Nuage de points du logarithme de la masse des gonades des ", italic(" P. lividus "), "et de leur masse (g)")))
summary(lm. <- lm(log_gonades ~ masse, data = oursins))
lm. %>% (function (lm, model = lm[["model"]], vars = names(model))
  ggplot(model, aes_string(x = vars[2], y = vars[1])) +
  geom_point() + stat_smooth(method = "lm", formula = y ~ x))+
    theme_classic() +
  labs( x = "Masse (g)", y = "Logarithme de la masse des gonades ", caption = expression(paste("Graphique mettant en évidence la correlation entre le logarithme de la masse des gonades des ", italic(" P. lividus "), "et leur masse (g)")))+
    theme(plot.caption = element_text(hjust = 0.5, size = 8))

82% des points suivent une distribution linéaire. Ce graphique nous suggère une relation linéaire croissante entre le logarithme de la masse des gonades et la masse des oursins.

Nous utiliserons les résidus du logarithme de la masse des gonades des P.lividus dans les prochains graphiques

#plot(lm., which = 1)
lm. %>% qplot(.fitted, .resid, data = .) +
  geom_hline(yintercept = 0) +
  geom_smooth(se = FALSE) +
   theme_classic() +
  labs( x = "Valeurs ajustées", y = "Résidus ", caption = expression(paste("Graphique des résidus en fonction des valeurs ajustées")))+
    theme(plot.caption = element_text(hjust = 0.5, size = 10))

Ce graphique est utilisé pour vérifier que la variance des erreurs de la variable dépendantes est constante. Cela permet de vérifier que la variance est indépendante de la valeur de la variable indépendante (condition d’homosceadasticité).

Les résidus semblent être dispersés au hasard autours de zéro. On peut tout de même observer une tendance locale ,pour les valeurs ajustées (fitted values) entre 0 et 0.7, à l’augmentation de la propagation des résidus à mesure que les valeurs ajustées.

La variance des erreurs semble être constante (homoscédasticité).

#plot(lm., which = 2)
lm. %>% qplot(sample = .stdresid, data = .) +
  geom_abline(intercept = 0, slope = 1, colour = "darkgray") +
  theme_classic() +
  labs( x = "Quantiles théoriques", y = "Résidus standardisés ", caption = expression(paste("Graphique de comparaison de la distribution des résidus standardisés avec la distribution normale ")))+
    theme(plot.caption = element_text(hjust = 0.5, size = 10))

Ce graphique permet d’évaluer l’ajustement des résidus standardisés à la distribution normale.

l’ajustement des résidus stanrdardisés à la distribution normale est pertinent.

#plot(lm., which = 3)
lm. %>% qplot(.fitted, sqrt(abs(.stdresid)), data = .) +
  geom_smooth(se = FALSE) +
    theme_classic() +
  labs( x = "Valeurs ajustées", y = "Racine carrée des résidus standardisés ", caption = expression(paste("Graphique de la racine carrée des résidus standardisés des résidus en fonction des valeurs ajustées")))+
    theme(plot.caption = element_text(hjust = 0.5, size = 10))

Ce graphique est utilisé pour vérifier que la variance des erreurs de la variable dépendantes est constante. Cela permet de vérifier que la variance est indépendante de la valeur de la variable indépendante (condition d’homosceadasticité).

Les racines carrées des résidus standardisés semblent être réparties aléatoirement autours de 0. Nous observons tout de même une tendance locale( pour les valeurs ajustées allant de 0 à 0.5) à l’augmentation des racines carrés des résidus à mesure que les valeurs ajustées augmentent.

4 Discussion

Le test-t de Student comparant deux groupes d’échantillons indépendants nous indique que la masse des gonades des P.lividus d’élevage, avec comme valeur moyenne 1.825888 ± 3.037895 est plus grande que la masse des gonades des P.lividus sauvages,avec comme valeur moyenne 1.002437 ± 1.533132. Ne connaissant pas les paramètres d’élaboration des stades de maturité des P.lividus, nous avons préféré ne pas faire intervenir cette variable, mais il pourrait être intéressant de le faire.

L’échiniculture semble donc être un moyen intéressant de consommer les gonades des oursins violets. En effet, elle présente le double avantage de produire des gonade plus lourdes qu’à l’état sauvage et de ne pas prélever de spécimens dans leur milieu naturel.

Bien qu’ayant un coefficiant de correlation de 0.86, un modèle de régression linéaire n’a pas pu être établi entre la masse des gonades des P.lividus et la masse des P.lividus. La masse des gonades ne comprenanant pas de valeurs négatives, une relation linéaire cohérente est obtenue entre le logarithme de la masse des gonades et la masse. Cette relation linéaire est pertinente mais comporte quelques défauts ( voir section régression linéaire ).

5 Conclusion

En conclusion, la masse des gonades des P.lividus d’élevage est significativement plus élevée que la masse des gonades des P.lividus sauvages.

Il existe une relation linéaire entre le logarithme de la masse des gonades des P.lividus et la masse de ceux-ci.

6 Bibliographies

LS0tCnRpdGxlOiAiQmlvbcOpdHJpZSBkZXMgb3Vyc2lucyB2aW9sZXRzIgpzdWJ0aXRsZTogIkRpZmbDqXJlbmNlIGVudHJlIGxhIG1hc3NlIGRlcyBnb25hZGVzIGRlcyAqUC5saXZpZHVzKiBzYXV2YWdlcyBldCBkJyBlY2hpbmljdWx0dXJlIgphdXRob3I6CiAgLSBuYW1lOiAiRGVsZ3JhbmdlIEx1Y2llbiIKICAgIGFmZmlsaWF0aW9uOiAiRXR1ZGlhbnQgw6AgbCd1bml2ZXJzaXTDqSBkZSBNb25zIGVuIEJBQzIgQmlvbG9naWUiCmRhdGU6ICIxMSBkw6ljZW1icmUgMjAxNyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0Ci0tLQoKI0ludHJvZHVjdGlvbgoKTCdvdXJzaW4gdmlvbGV0IDogKlBhcmFjZW50cm90dXMgbGl2aWR1cyogKExhbWFyY2ssIDE4MTYpLCBlc3QgdW4gb3Vyc2luIGRlIGxhIGZhbWlsbGUgZGVzIApQYXJlY2hpbmlkYWUgcHJpbmNpcGFsZW1lbnQgcmVwcsOpc2VudMOpIGVuIG1lciBNw6lkaXRlcnJhbm7DqWUsIGVuIE9jw6lhbiBBdGxhbnRpcXVlLCBlbiBNYW5jaGUgZXQgZW4gbWVyIGR1IE5vcmQuIElsIHMnYWdpdCBkJ3VuZSBlc3DDqGNlIGdvbm9jaG9yaXF1ZSBkb250IGxlcyBnb25hZGVzIHNvbnQgY29uc29tbcOpZXMgcGFyIGwnaG9tbWUuIE9yZ2FuaXNtZSBiZW50aGlxdWUgZXQgYnJvdXRldXIsIGlsIHNlIG5vdXJyaXQgcHJpbmNpcGFsZW1lbnQgZCdhbGd1ZXMuIFNhIHRhaWxsZSBtb3llbm5lICh0ZXN0IGV0IHBpcXVhbnRzKSBlc3QgZCdlbnZpcm9uIDggY20uCgohW1Bob3RvZ3JhcGhpZSBkZSAqUGFyYWNlbnRyb3R1cyBsaXZpZHVzKl0oLi4vaW1hZ2UvUGFyYWNlbnRyb3R1c19saXZpZHVzX0Jhbnl1bHMuanBnKQoKI0J1dAoKTCdvYmpldCBkZSBjZXR0ZSBhbmFseXNlIGVzdCBkZSBzYXZvaXIgc2kgbCdlY2hpbmljdWx0dXJlIGRlcyAqUGFyYWNlbnRyb3R1cyBsaXZpZHVzKiBhIHVuZSBpbmZsdWVuY2Ugc3VyIGxhIG1hc3NlIGRlIGxldXJzIGdvbmFkZXMuIAoKIyBNYXTDqXJpZWwgZXQgbcOpdGhvZGUKCiMjIEFjcXVpc2l0aW9uIGRlcyBkb25uw6llcyAKCkxlcyBvYnNlcnZhdGlvbnMgYmlvbcOpdHJpcXVlcyB1dGlsaXPDqWVzIGRhbnMgY2UgdHJhdmFpbCBwcm92aWVubmVudCBkJ3VuZSDDqXR1ZGUgZXhww6lyaW1lbnRhbGUgc3VyIGxhIGNyb2lzc2FuY2UgZGVzICpQYXJhY2VudHJvdHVzIGxpdmlkdXMqIGRlIDE5OTYgcHVibGnDqWUgZGFucyAiIEpvdXJuYWwgb2YgRXhwZXJpbWVudGFsIE1hcmluZSBCaW9sb2d5IGFuZCBFY29sb2d5ICIgZXQgcsOpYWxpc8OpZSBwYXIgUGguIEdyb3NqZWFuLCBDaC4gU3BpcmxldCBldCBNLiBKYW5nb3V4LiAKCkxlcyBvdXJzaW5zIHNhdXZhZ2VzIG1lc3Vyw6lzIGFpbnNpIHF1ZSBsYSBzb3VjaGUgb3JpZ2luZWxsZSBkZXMgb3Vyc2lucyBkJ8OpbGV2YWdlIHByb3ZpZW5uZW50IGRlIGxhIGNvdGUgcm9jaGV1c2UgZGUgTW9yZ2F0IGVuIEJyZXRhZ25lICggRnJhbmNlICkuIAoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGNvd3Bsb3QpCiM/bWFwX2RhdGEoKQp3b3JsZCA8LSBtYXBfZGF0YSgid29ybGQiKQp3b3JsZCRyZWdpb24gPC0gYXMuZmFjdG9yKHdvcmxkJHJlZ2lvbikKd29ybGQkc3VicmVnaW9uIDwtIGFzLmZhY3Rvcih3b3JsZCRzdWJyZWdpb24pCkZyYW5jZSA8LSBmaWx0ZXIod29ybGQsIHJlZ2lvbiA9PSAiRnJhbmNlIikKCmdncGxvdChkYXRhID0gRnJhbmNlKSArCiAgZ2VvbV9wb2x5Z29uKG1hcHBpbmcgPSBhZXMobG9uZywgbGF0LCBncm91cCA9IGdyb3VwKSwgZmlsbD0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siKSAgKwogIGdlb21fcG9pbnQoYWVzKHkgPSA0OC4yMzAxMTAgLCB4ID0gLTQuNTExNzM2ICwgY29sb3IgPSAiI0NEMDAwMCIpLCBzaXplID0gMiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkrdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGNvb3JkX3F1aWNrbWFwKCkgKwogIGxhYnMoIGNhcHRpb24gPSAiQ2FydGUgZGUgbGEgZnJhbmNlIGF2ZWMgbGEgbWlzZSBlbiDDqXZpZGVuY2UgZGUgTW9yZ2F0ICggQnJldGFnbmUgKSAiKQpgYGAKCiMjIEFuYWx5c2UgZGVzIGRvbm7DqWVzCk5vdXMgZml4b25zIGxlIHNldWlsIGFscGhhIMOgIDAuMDUgcG91ciBsJ2Vuc2VtYmxlIGRlcyBhbmFseXNlcyBjaSBkZXNzb3VzCgoxKSBQb3VyIGNvbXBhcmVyIGxhIG1hc3NlIGRlcyBnb25hZGVzIGRlcyBvdXJzaW5zIGQnw6lsZXZhZ2UgZXQgZGVzIG91cnNpbnMgc2F1dmFnZXMgbm91cyB1dGlsaXNvbnMgbGUgdGVzdCBkJ2h5cG90aMOoc2UgOiB0ZXN0LXQgZGUgU3R1ZGVudCBjb21wYXJhbnQgZGV1eCBncm91cGVzIGTigJnDqWNoYW50aWxsb25zIGluZMOpcGVuZGFudHMuCgpMZXMgaHlwb3Row6hzZXMgc29udCA6IFwoSF97MH1cKSA6IFwoXG11X3sxfSA9IFxtdV97Mn1cKQogICAgICAgICAgICAgICAgICAgICAgXChIX3sxfVwpIDogXChcbXVfezF9IFxuZSQgIFxtdV97Mn1cKSAKICAgICAgICAgICAgICAgICAgCkxlcyBjb25kaXRpb25zIGRlIHZhbGlkaXTDqXMgZHUgdGVzdCBzb250IDogCgotIFVuIMOpY2hhbnRpbGxvbm5hZ2UgYWzDqWF0b2lyZQotIERlcyBvYnNlcnZhdGlvbnMgaW5kw6lwZW5kYW50ZXMgbGVzIHVuZXMgZGVzIGF1dHJlcwoKLT4gQ2VzIGRldXggY29uZGl0aW9ucyBzb250IHN1cHBvc8OpZXMgdmFsaWTDqWVzCgotIFVuZSBkaXN0cmlidXRpb24gZGVzIHLDqXNpZHVzIHF1aSBkb2l0IHN1aXZyZSB1bmUgZGlzdHJpYnV0aW9uIG5vcm1hbGUgb3UgYXBwcm94aW1hdGl2ZW1lbnQgbm9ybWFsZSA6IHVuIGdyYXBoaXF1ZSBxdWFudGlsZS1xdWFudGlsZSBkZSBjb21wYXJhaXNvbiBkZSBsYSBkaXN0cmlidXRpb24gZGVzIHLDqXNpZHVzIGF2ZWMgdW5lIGRpc3RyaWJ1dGlvbiBub3JtYWxlIHBlcm1ldCBkJ29ic2VydmVyIHNpIGNldHRlIGNvbmRpdGlvbiBlc3QgcmVzcGVjdMOpZS4KCkV0L291IHVuIGdyYW5kIG5vbWJyZSBkJ29ic2VydmF0aW9ucwoKQ2V0dGUgZGVybmnDqHJlIGNvbmRpdGlvbiBzZXJhIHRlc3TDqWUgbG9ycyBkZSBsJ2FuYWx5c2Ugc3RhdGlzdGlxdWUgCgoyKSBVbiBtb2TDqGxlIGRlIHLDqWdyZXNzaW9uIGxpbsOpYWlyZSBzZXJhIHV0aWxpc8OpIHBvdXIgw6l0YWJsaXIgdW5lIHJlbGF0aW9uIGxpbsOpYWlyZSBlbnRyZSAyIHZhcmlhYmxlcyBxdWFudGl0YXRpdmVzLiBMZSB0ZXN0IG5lIHRyYWl0ZSBwYXMgY2VzIDIgdmFyaWFibGVzIGRlIG1hbmnDqHJlIMOpZ2FsZSA6IHVuZSBkZXMgZGV1eCB2YXJpYWJsZXMgZXN0IGRpdGUgZMOpcGVuZGFudGUgZGUgbCdhdXRyZSAoIGluZMOpcGVuZGFudGUgKS4KCm9uIHV0aWxpc2UgY29tbWUgY3JpdMOocmUgZGUgZMOpdGVybWluYXRpb24gZGUgbGEgZHJvaXRlIDogbGEgbWluaW1pc2F0aW9uIGRlIGxhIHNvbW1lIGRlcyBjYXJyw6lzIGRlcyByw6lzaWR1cy4KCi0gTm91cyB0ZXN0b25zIGwnaG9tb3NjZWRhc3RpY2l0w6kgYXZlYyAzIGdyYXBoaXF1ZXMgOiAtIExlIEdyYXBoaXF1ZSBkZXMgcsOpc2lkdXMgZW4gZm9uY3Rpb24gZGVzIHZhbGV1cnMgYWp1c3TDqWVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIExlIEdyYXBoaXF1ZSBkZSBsYSByYWNpbmUgY2FycsOpZSBkZXMgcsOpc2lkdXMgZW4gZm9uY3Rpb24gZGVzIHZhbGV1cnMgYWp1c3TDqWVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSBOb3VzIHRlc3RvbnMgZ3JhcGhpcXVlbWVudCBsYSBwZXJ0aW5lbmNlIGRlIGxhIGRpc3RyaWJ1dGlvbiBkZXMgcsOpc2lkdXMgc3RhbmRhcmRpc8OpcyBhdmVjIGxhIGRpc3RyaWJ1dGlvbiBub3JtYWxlLgojIFLDqXN1bHRhdHMgCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCm91cnNpbnMgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9vdXJzaW5zLnhsc3giLCAKICAgIHNraXAgPSA5KQpWaWV3KG91cnNpbnMpCgpgYGAKCiMjIE1hc3NlIGRlcyBnb25hZGVzIAoKIyMjIFN0YXRpc3RpcXVlcyBkZXNjcmlwdGl2ZXMKCiMjIyMgU3RhdGlzdGlxdWVzIGRlc2NyaXB0aXZlcyBudW3DqXJpcXVlcwoKTGEgbW95ZW5uZSBkZSBsYSBtYXNzZXMgZGVzIGdvbmFkZXMgZXN0IGRpZmbDqXJlbnRlIHBvdXIgbGVzIG91cnNpbnMgc2F1dmFnZXMgKCQxLjAwXHBtMS41MyBnJCkgZXQgcG91ciBsZXMgb3Vyc2lucyBkJ8OpbGV2YWdlICAoJDEuODNccG0zLjA0IGckKS4gTGVzIHZhbGV1cnMgZGVzIMOpY2FydHMtdHlwZXMgc29udCBwbHVzIMOpbGV2w6llcyBxdWUgbGVzIHZhbGV1cnMgZGVzIG1veWVubmVzLiBMZXMgbWVzdXJlcyBkZSBsYSBtYXNzZSBkZXMgZ29uYWRlcyBzb250IHBhciBjb25zw6lxdWVudCwgdHLDqHMgZGlzcGVyc8OpZXMgYXV0b3VycyBkZSBsYSBtb3llbm5lLgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCm91cnNpbnMlPiVncm91cF9ieShvcmlnaW5lKSU+JSBzdW1tYXJpc2UoIm1lYW4iID0gbWVhbihnb25hZGVzLCBuYS5ybT1UUlVFKSwgInNkIiA9IHNkKGdvbmFkZXMsIG5hLnJtPVRSVUUpLCAibnVtYmVyIiA9IGxlbmd0aChnb25hZGVzKSkgLT4gZ29uX29yCgpsaWJyYXJ5KGtuaXRyKQoKa2FibGUoeCA9IGdvbl9vciwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAiVGFibGVhdSBkZSBsYSBtYXNzZSBkZXMgZ29uYWRlcyBtb3llbm5lIChnKSBkZXMgb3Vyc2lucyBzYXV2YWdlcyBldCBkJ8OpbGV2YWdlICIsIGNvbC5uYW1lcyA9IGMoIk9yaWdpbmUiLCAiTWFzc2UgZGVzIGdvbmFkZXMgbW95ZW5uZSIsICJFY2FydC10eXBlIiwgIk5vbWJyZSBkJ29ic2VydmF0aW9ucyIpLCBhbGlnbiA9ICJjIikKCmBgYAoKIyMjIyBTdGF0aXN0aXF1ZXMgZGVzY3JpcHRpdmVzIGdyYXBoaXF1ZXMKCkxhIHJlcHLDqXNlbnRhdGlvbiBncmFwaGlxdWUgc291cyBmb3JtZSBkZSBib3hwbG90IHBlcm1ldCBkZSBzZSByZXByw6lzZW50ZXIgdmlzdWVsbGVtZW50IHN1ciBsZXMgNSBub21icmVzIDogbGEgdmFsZXVyIG1pbmltYWxlLCBsZSBwcmVtaWVyIHF1YXJ0aWxlLCBsYSBtZWRpYW5lLCBsZSB0cm9pc2nDqG1lIHF1YXJ0aWxlIGV0IGxhIHZhbGV1ciBtYXhpbWFsZS4gTGUgZ3JhcGhpcXVlIHNlbWJsZSBub3VzIGZhaXJlIHBhcnQgZCd1bmUgZGlmZsOpcmVuY2UgZW50cmUgbGEgbWFzc2VzIGRlcyBnb25hZGVzIGRlcyAqUC5saXZpZHVzKiBzYXV2YWdlcyBldCBkJ8OpbGV2YWdlLgoKYGBge3J9CmxpYnJhcnkoImdncGxvdDIiKQpnZ3Bsb3QoZGF0YT1vdXJzaW5zKSArCiAgZ2VvbV9ib3hwbG90KG1hcHBpbmc9YWVzKHg9IGFzLmZhY3RvcihvcmlnaW5lKSx5PWdvbmFkZXMpLCBmaWxsPWMoIiMyNmM0MGQiLCAiIzBkNmJjNCIpKSsKdGhlbWVfY2xhc3NpYygpICsKIGxhYnMoIHggPSAiT3JpZ2luZSIsIHkgPSAiTWFzc2UgZGVzIGdvbmFkZXMgKGcpIiwgY2FwdGlvbiA9IGV4cHJlc3Npb24ocGFzdGUoIkJveHBsb3QgZGUgY29tcGFyYWlzb24gZGUgbGEgbWFzc2UgZGVzIGdvbmFkZXMgZGVzICIsIGl0YWxpYygiIFAuIGxpdmlkdXMgIiksICJzZWxvbiBsZXVyIG9yaWdpbmUuIikpKSsKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxMCkpCmBgYAoKCklsIHNlbWJsZSDDqWdhbGVtZW50IHkgYXZvaXIgdW5lIHZhcmlhdGlvbiBkZSBsYSAgbWFzc2VzIGRlcyBnb25hZGVzIGRlcyAqUC5saXZpZHVzKiBlbiBmb25jdGlvbiBkdSBzdGFkZSBkZSBtYXR1cml0w6kKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdChkYXRhPW91cnNpbnMpICsKICBnZW9tX2JveHBsb3QobWFwcGluZz1hZXMoeD0gYXMuZmFjdG9yKG1hdHVyaXRlKSx5PWdvbmFkZXMsIGZpbGw9b3JpZ2luZSkpKwogIHRoZW1lX2NsYXNzaWMoKSArCiBsYWJzKCB4ID0gIk9yaWdpbmUiLCB5ID0gIk1hc3NlIGRlcyBnb25hZGVzIChnKSIsIGNhcHRpb24gPSBleHByZXNzaW9uKHBhc3RlKCJCb3hwbG90IGRlIGNvbXBhcmFpc29uIGRlIGxhIG1hc3NlIGRlcyBnb25hZGVzIGRlcyAiLCBpdGFsaWMoIiBQLiBsaXZpZHVzICIpLCAic2Vsb24gbGV1ciBvcmlnaW5lIGV0IGVuIGZvbmN0aW9uIGRlIGxldXIgc3RhZGUgZGUgbWF0dXJpdMOpIikpKSsKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSA5KSkKYGBgCgoKIyMjIFN0YXRpc3RpcXVlcwojIyMjIFRlc3QgZCdoeXBvdGjDqHNlCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpvdXJzaW5zICU+JSBtdXRhdGUoZ29uYWRlcy5yZXMgPSBnb25hZGVzIC0gYXZlKGdvbmFkZXMsIG9yaWdpbmUpKSAtPiBvdXJzaW5zCmBgYAoKYGBge3J9CmNhcjo6cXFQbG90KG91cnNpbnMkZ29uYWRlcy5yZXMsIGRpc3RyaWJ1dGlvbiA9ICJub3JtIiwKICBlbnZlbG9wZSA9IDAuOTUsIGNvbCA9ICJCbGFjayIsIHlsYWIgPSAiUsOpc2lkdXMgZGUgbGEgbWFzc2VzIGRlcyBnb25hZGVzIix4bGFiID0gIlF1YW50aWxlcyBkZSBsYSBkaXN0cmlidXRpb24gbm9ybWFsZSIpCmBgYAoKLSBMYSBkaXN0cmlidXRpb24gZGVzIHLDqXNpZHVzIGRlIGxhIG1hc3NlcyBkZXMgZ29uYWRlcyBuZSBzdWl0IHBhcyB1bmUgZGlzdHJpYnV0aW9uIG5vcm1hbGUgKCBhdmVjIHVuZSBpbnRlcnZhbGUgZGUgY29uZmlhbmNlIGRlIDk1JSkuIExlIHByZW1pZXIgY3JpdMOocmUgZCdhcHBsaWNhdGlvbiBkdSB0ZXN0LXQgZGUgc3R1ZGVudCBjb21wYXJhbnQgZGV1eCBncm91cGVzIGQnw6ljaGFudGlsbG9ucyBpbmTDqXBlbmRhbnRzIG4nZXN0IHBhcyByZXNwZWN0w6kuIAoKLSBMZSBub21icmUgZCdvYmVzZXJ2YXRpb25zIGVzdCDDqWxldsOpLgoKLT4gTGUgdGVzLXQgZGUgc3R1ZGVudCBpbmTDqXBlbmRhbnQgcGV1dCDDqnRyZSBhcHBsaXF1w6kuCgpMZXMgaHlwb3Row6hzZXMgc29udCA6CgpcKEhfezB9XCkgOiBcKFxtdV97c2F1dmFnZX0gPSBcbXVfe8OpbGV2YWdlfVwpClwoSF97MX1cKSA6IFwoXG11X3tzYXV2YWdlfSBcbmUgIFxtdV97w6lsZXZhZ2V9XCkgCgpgYGB7cn0KdC50ZXN0KGdvbmFkZXMgfiBvcmlnaW5lLCBkYXRhID0gb3Vyc2lucywKICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBjb25mLmxldmVsID0gMC45NSwgdmFyLmVxdWFsID0gVFJVRSkKYGBgCkxlIGRlZ3LDqSBkZSBjb25maWFuY2UgZXN0IGZpeMOpIGF1IHNldWlsIFwoXGFscGhhXCkgZGUgMC4wNQpMZSBzZXVpbCBkZSBwcm9iYWJpbGl0w6kgY3JpdGlxdWUgKCBwICkgZXN0IMOpZ2FsZSDDoCAwLjAwMDQ3NjcgCnAgPCAwLjA1CgotPk9uIGEgdW5lIGRpZmbDqXJlbmNlIHNpZ25pZmljYXRpdmUgZW50cmUgbGVzIG1veWVubmVzIGF1IHNldWlsIFwoXGFscGhhXCkgZGUgMC4wNQotPiBMJ2h5cG90aMOoc2UgXChIX3swfVwpIDogXChcbXVfe3NhdXZhZ2V9ID0gXG11X3vDqWxldmFnZX1cKSBlc3QgcmVqZXTDqWUKCiMjIyMgUsOpZ3Jlc3Npb24gbGluw6lhaXJlCgpgYGB7cn0KbGlicmFyeSgiY29ycnBsb3QiKQpjb3JycGxvdDo6Y29ycnBsb3QoY29yKG91cnNpbnNbLCAyOjVdLAogIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKSxtZXRob2QgPSAibnVtIikKCmBgYApMYSBtYXRyaWNlIGRlIGNvcnJlbGF0aW9uIG5vdXMgZG9ubmUgdW4gY29lZmZpY2lhbnQgZGUgY29ycsOpbGF0aW9uIGRlIDAuODYgZW50cmUgbGEgbWFzc2UgZGVzIGdvbmFkZXMgZXQgbGEgbWFzc2UuCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpvdXJzaW5zICU+JSBtdXRhdGUgKCBsb2dfZ29uYWRlcz0gbG9nKGdvbmFkZXMrMSkpIC0+IG91cnNpbnMKI2xvZyAoZ29uYWRlcysxKSBjYXIgbG9nIGRlIDAgPSBpbmZpbmkgLT4gcHJvYmxlbWUKCmBgYApgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmdncGxvdChkYXRhPSBvdXJzaW5zKSsKZ2VvbV9wb2ludCAobWFwcGluZyA9IGFlcyAoeD1tYXNzZSwgeT1sb2dfZ29uYWRlcykpKwogICBsYWJzKCB4ID0gIk1hc3NlIChnKSIsIHkgPSAiTG9nYXJpdGhtZSBkZSBsYSBtYXNzZSBkZXMgZ29uYWRlcyAiLCBjYXB0aW9uID0gZXhwcmVzc2lvbihwYXN0ZSgiTnVhZ2UgZGUgcG9pbnRzIGR1IGxvZ2FyaXRobWUgZGUgbGEgbWFzc2UgZGVzIGdvbmFkZXMgZGVzICIsIGl0YWxpYygiIFAuIGxpdmlkdXMgIiksICJldCBkZSBsZXVyIG1hc3NlIChnKSIpKSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShsbS4gPC0gbG0obG9nX2dvbmFkZXMgfiBtYXNzZSwgZGF0YSA9IG91cnNpbnMpKQpsbS4gJT4lIChmdW5jdGlvbiAobG0sIG1vZGVsID0gbG1bWyJtb2RlbCJdXSwgdmFycyA9IG5hbWVzKG1vZGVsKSkKICBnZ3Bsb3QobW9kZWwsIGFlc19zdHJpbmcoeCA9IHZhcnNbMl0sIHkgPSB2YXJzWzFdKSkgKwogIGdlb21fcG9pbnQoKSArIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCkpKwogICAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKCB4ID0gIk1hc3NlIChnKSIsIHkgPSAiTG9nYXJpdGhtZSBkZSBsYSBtYXNzZSBkZXMgZ29uYWRlcyAiLCBjYXB0aW9uID0gZXhwcmVzc2lvbihwYXN0ZSgiR3JhcGhpcXVlIG1ldHRhbnQgZW4gw6l2aWRlbmNlIGxhIGNvcnJlbGF0aW9uIGVudHJlIGxlIGxvZ2FyaXRobWUgZGUgbGEgbWFzc2UgZGVzIGdvbmFkZXMgZGVzICIsIGl0YWxpYygiIFAuIGxpdmlkdXMgIiksICJldCBsZXVyIG1hc3NlIChnKSIpKSkrCiAgICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSA4KSkKCmBgYAo4MiUgZGVzIHBvaW50cyBzdWl2ZW50IHVuZSBkaXN0cmlidXRpb24gbGluw6lhaXJlLgpDZSBncmFwaGlxdWUgbm91cyBzdWdnw6hyZSB1bmUgcmVsYXRpb24gbGluw6lhaXJlIGNyb2lzc2FudGUgZW50cmUgbGUgbG9nYXJpdGhtZSBkZSBsYSBtYXNzZSBkZXMgZ29uYWRlcyBldCBsYSBtYXNzZSBkZXMgb3Vyc2lucy4gCgpOb3VzIHV0aWxpc2Vyb25zIGxlcyByw6lzaWR1cyBkdSBsb2dhcml0aG1lIGRlIGxhIG1hc3NlIGRlcyBnb25hZGVzIGRlcyAqUC5saXZpZHVzICogZGFucyBsZXMgcHJvY2hhaW5zIGdyYXBoaXF1ZXMKYGBge3J9CiNwbG90KGxtLiwgd2hpY2ggPSAxKQpsbS4gJT4lIHFwbG90KC5maXR0ZWQsIC5yZXNpZCwgZGF0YSA9IC4pICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSkgKwogICB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoIHggPSAiVmFsZXVycyBhanVzdMOpZXMiLCB5ID0gIlLDqXNpZHVzICIsIGNhcHRpb24gPSBleHByZXNzaW9uKHBhc3RlKCJHcmFwaGlxdWUgZGVzIHLDqXNpZHVzIGVuIGZvbmN0aW9uIGRlcyB2YWxldXJzIGFqdXN0w6llcyIpKSkrCiAgICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxMCkpCgpgYGAKQ2UgZ3JhcGhpcXVlIGVzdCB1dGlsaXPDqSBwb3VyIHbDqXJpZmllciBxdWUgbGEgdmFyaWFuY2UgZGVzIGVycmV1cnMgZGUgbGEgdmFyaWFibGUgZMOpcGVuZGFudGVzIGVzdCBjb25zdGFudGUuIENlbGEgcGVybWV0IGRlIHbDqXJpZmllciBxdWUgbGEgdmFyaWFuY2UgZXN0IGluZMOpcGVuZGFudGUgZGUgbGEgdmFsZXVyIGRlIGxhIHZhcmlhYmxlIGluZMOpcGVuZGFudGUgKGNvbmRpdGlvbiBkJ2hvbW9zY2VhZGFzdGljaXTDqSkuCgpMZXMgcsOpc2lkdXMgc2VtYmxlbnQgw6p0cmUgZGlzcGVyc8OpcyBhdSBoYXNhcmQgYXV0b3VycyBkZSB6w6lyby4KT24gcGV1dCB0b3V0IGRlIG3Dqm1lIG9ic2VydmVyIHVuZSB0ZW5kYW5jZSBsb2NhbGUgLHBvdXIgbGVzIHZhbGV1cnMgYWp1c3TDqWVzIChmaXR0ZWQgdmFsdWVzKSBlbnRyZSAwIGV0IDAuNywgw6AgbCdhdWdtZW50YXRpb24gZGUgbGEgcHJvcGFnYXRpb24gZGVzIHLDqXNpZHVzIMOgIG1lc3VyZSBxdWUgbGVzIHZhbGV1cnMgYWp1c3TDqWVzLgoKTGEgdmFyaWFuY2UgZGVzIGVycmV1cnMgc2VtYmxlIMOqdHJlIGNvbnN0YW50ZSAoaG9tb3Njw6lkYXN0aWNpdMOpKS4gCgpgYGB7cn0KI3Bsb3QobG0uLCB3aGljaCA9IDIpCmxtLiAlPiUgcXBsb3Qoc2FtcGxlID0gLnN0ZHJlc2lkLCBkYXRhID0gLikgKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgY29sb3VyID0gImRhcmtncmF5IikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyggeCA9ICJRdWFudGlsZXMgdGjDqW9yaXF1ZXMiLCB5ID0gIlLDqXNpZHVzIHN0YW5kYXJkaXPDqXMgIiwgY2FwdGlvbiA9IGV4cHJlc3Npb24ocGFzdGUoIkdyYXBoaXF1ZSBkZSBjb21wYXJhaXNvbiBkZSBsYSBkaXN0cmlidXRpb24gZGVzIHLDqXNpZHVzIHN0YW5kYXJkaXPDqXMgYXZlYyBsYSBkaXN0cmlidXRpb24gbm9ybWFsZSAiKSkpKwogICAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTApKQoKYGBgCkNlIGdyYXBoaXF1ZSBwZXJtZXQgZCfDqXZhbHVlciBsJ2FqdXN0ZW1lbnQgZGVzIHLDqXNpZHVzICBzdGFuZGFyZGlzw6lzIMOgIGxhIGRpc3RyaWJ1dGlvbiBub3JtYWxlLiAgCgpsJ2FqdXN0ZW1lbnQgZGVzIHLDqXNpZHVzIHN0YW5yZGFyZGlzw6lzIMOgIGxhIGRpc3RyaWJ1dGlvbiBub3JtYWxlIGVzdCBwZXJ0aW5lbnQuIAoKYGBge3J9CiNwbG90KGxtLiwgd2hpY2ggPSAzKQpsbS4gJT4lIHFwbG90KC5maXR0ZWQsIHNxcnQoYWJzKC5zdGRyZXNpZCkpLCBkYXRhID0gLikgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyggeCA9ICJWYWxldXJzIGFqdXN0w6llcyIsIHkgPSAiUmFjaW5lIGNhcnLDqWUgZGVzIHLDqXNpZHVzIHN0YW5kYXJkaXPDqXMgIiwgY2FwdGlvbiA9IGV4cHJlc3Npb24ocGFzdGUoIkdyYXBoaXF1ZSBkZSBsYSByYWNpbmUgY2FycsOpZSBkZXMgcsOpc2lkdXMgc3RhbmRhcmRpc8OpcyBkZXMgcsOpc2lkdXMgZW4gZm9uY3Rpb24gZGVzIHZhbGV1cnMgYWp1c3TDqWVzIikpKSsKICAgIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDEwKSkKCmBgYAoKQ2UgZ3JhcGhpcXVlIGVzdCB1dGlsaXPDqSBwb3VyIHbDqXJpZmllciBxdWUgbGEgdmFyaWFuY2UgZGVzIGVycmV1cnMgZGUgbGEgdmFyaWFibGUgZMOpcGVuZGFudGVzIGVzdCBjb25zdGFudGUuIENlbGEgcGVybWV0IGRlIHbDqXJpZmllciBxdWUgbGEgdmFyaWFuY2UgZXN0IGluZMOpcGVuZGFudGUgZGUgbGEgdmFsZXVyIGRlIGxhIHZhcmlhYmxlIGluZMOpcGVuZGFudGUgKGNvbmRpdGlvbiBkJ2hvbW9zY2VhZGFzdGljaXTDqSkuCgpMZXMgcmFjaW5lcyBjYXJyw6llcyBkZXMgcsOpc2lkdXMgc3RhbmRhcmRpc8OpcyBzZW1ibGVudCDDqnRyZSByw6lwYXJ0aWVzIGFsw6lhdG9pcmVtZW50IGF1dG91cnMgZGUgMC4gTm91cyBvYnNlcnZvbnMgdG91dCBkZSBtw6ptZSB1bmUgdGVuZGFuY2UgbG9jYWxlKCBwb3VyIGxlcyB2YWxldXJzIGFqdXN0w6llcyBhbGxhbnQgZGUgMCDDoCAwLjUpIMOgIGwnYXVnbWVudGF0aW9uIGRlcyByYWNpbmVzIGNhcnLDqXMgZGVzIHLDqXNpZHVzIMOgIG1lc3VyZSBxdWUgbGVzIHZhbGV1cnMgYWp1c3TDqWVzIGF1Z21lbnRlbnQuCgojRGlzY3Vzc2lvbgpMZSB0ZXN0LXQgZGUgU3R1ZGVudCBjb21wYXJhbnQgZGV1eCBncm91cGVzIGTigJnDqWNoYW50aWxsb25zIGluZMOpcGVuZGFudHMgbm91cyBpbmRpcXVlIHF1ZSBsYSBtYXNzZSBkZXMgZ29uYWRlcyBkZXMgKlAubGl2aWR1cyogIGQnw6lsZXZhZ2UsIGF2ZWMgY29tbWUgdmFsZXVyIG1veWVubmUgMS44MjU4ODggwrEgMy4wMzc4OTUgZXN0IHBsdXMgZ3JhbmRlIHF1ZSBsYSBtYXNzZSBkZXMgZ29uYWRlcyBkZXMgKlAubGl2aWR1cyogc2F1dmFnZXMsYXZlYyBjb21tZSB2YWxldXIgbW95ZW5uZSAxLjAwMjQzNyDCsSAxLjUzMzEzMi4KTmUgY29ubmFpc3NhbnQgcGFzIGxlcyBwYXJhbcOodHJlcyBkJ8OpbGFib3JhdGlvbiBkZXMgc3RhZGVzIGRlIG1hdHVyaXTDqSBkZXMgKlAubGl2aWR1cyosIG5vdXMgYXZvbnMgcHLDqWbDqXLDqSBuZSBwYXMgZmFpcmUgaW50ZXJ2ZW5pciBjZXR0ZSB2YXJpYWJsZSwgbWFpcyBpbCBwb3VycmFpdCDDqnRyZSBpbnTDqXJlc3NhbnQgZGUgbGUgZmFpcmUuCgpMJ8OpY2hpbmljdWx0dXJlIHNlbWJsZSBkb25jIMOqdHJlIHVuIG1veWVuIGludMOpcmVzc2FudCBkZSBjb25zb21tZXIgbGVzIGdvbmFkZXMgZGVzIG91cnNpbnMgdmlvbGV0cy4gRW4gZWZmZXQsIGVsbGUgcHLDqXNlbnRlIGxlIGRvdWJsZSBhdmFudGFnZSBkZSBwcm9kdWlyZSBkZXMgZ29uYWRlIHBsdXMgbG91cmRlcyBxdSfDoCBsJ8OpdGF0IHNhdXZhZ2UgZXQgZGUgbmUgcGFzIHByw6lsZXZlciBkZSBzcMOpY2ltZW5zIGRhbnMgbGV1ciBtaWxpZXUgbmF0dXJlbC4KCgpCaWVuIHF1J2F5YW50IHVuIGNvZWZmaWNpYW50IGRlIGNvcnJlbGF0aW9uIGRlIDAuODYsIHVuIG1vZMOobGUgZGUgcsOpZ3Jlc3Npb24gbGluw6lhaXJlIG4nYSBwYXMgcHUgw6p0cmUgw6l0YWJsaSBlbnRyZSBsYSBtYXNzZSBkZXMgZ29uYWRlcyBkZXMgKlAubGl2aWR1cyogZXQgbGEgbWFzc2UgZGVzICpQLmxpdmlkdXMqLiBMYSBtYXNzZSBkZXMgZ29uYWRlcyBuZSBjb21wcmVuYW5hbnQgcGFzIGRlIHZhbGV1cnMgbsOpZ2F0aXZlcywgdW5lIHJlbGF0aW9uIGxpbsOpYWlyZSBjb2jDqXJlbnRlIGVzdCBvYnRlbnVlIGVudHJlIGxlIGxvZ2FyaXRobWUgZGUgbGEgbWFzc2UgZGVzIGdvbmFkZXMgZXQgbGEgbWFzc2UuIENldHRlIHJlbGF0aW9uIGxpbsOpYWlyZSBlc3QgcGVydGluZW50ZSBtYWlzIGNvbXBvcnRlIHF1ZWxxdWVzIGTDqWZhdXRzICggdm9pciBzZWN0aW9uIHLDqWdyZXNzaW9uIGxpbsOpYWlyZSApLgoKCiNDb25jbHVzaW9uCgpFbiBjb25jbHVzaW9uLCBsYSBtYXNzZSBkZXMgZ29uYWRlcyBkZXMgKlAubGl2aWR1cyogZCfDqWxldmFnZSBlc3Qgc2lnbmlmaWNhdGl2ZW1lbnQgcGx1cyDDqWxldsOpZSBxdWUgbGEgbWFzc2UgZGVzIGdvbmFkZXMgZGVzICpQLmxpdmlkdXMqIHNhdXZhZ2VzLiAKCklsIGV4aXN0ZSB1bmUgcmVsYXRpb24gbGluw6lhaXJlIGVudHJlIGxlIGxvZ2FyaXRobWUgZGUgbGEgbWFzc2UgZGVzIGdvbmFkZXMgZGVzICpQLmxpdmlkdXMqIGV0IGxhIG1hc3NlIGRlIGNldXgtY2kuIAoKI0JpYmxpb2dyYXBoaWVzCgotIFBoLiBHcm9zamVhbiwgQ2guIFNwaXJsZXQsIE0uIGphbmdvdXguICpFeHBlcmltZW50YWwgc3R1ZHkgb2YgZ3Jvd3RoIGluIHRoZSBlY2hpbm9pZCBQYXJhY2VudHJvdHVzIGxpdmlkdXMgKExhbWFyY2ssIDE4MTYpIChFY2hpbm9kZXJtYXRhKS4qIEpvdXJuYWwgb2YgRXhwZXJpbWVudGFsIE1hcmluZSBCaW9sb2d5IGFuZCBFY29sb2d5LiBWb2x1bWUgMjAxLCBJc3N1ZXMgMeKAkzIsIDEgU2VwdGVtYmVyIDE5OTYsIFBhZ2VzIDE3My0xODQuCgotIGh0dHA6Ly9kb3Jpcy5mZmVzc20uZnIvRXNwZWNlcy9QYXJhY2VudHJvdHVzLWxpdmlkdXMtT3Vyc2luLXZpb2xldC0xNDM3Cgo=